home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 297_01 / exampl9.spr < prev    next >
Text File  |  1980-01-01  |  2KB  |  61 lines

  1. /* example9.spr */
  2. /* exploring the assert primitive */
  3. /* a call to (asserta List) will add a copy of List as 
  4.    a clause (i.e. rule or fact) to the "workspace".
  5.    asserta will add it to the beginning
  6.    assertz will add it to the end.
  7.    
  8.    Below is a way consult could have been defined in 
  9.    prolog.
  10.  
  11. */
  12.  
  13. /*************** version 1 **************/
  14.  
  15. ((alternative_consult_1 Filename)
  16.  (seeing OldFile_we_were_reading) /* hang on to it ! */
  17.  (see Filename) /* read from this now */
  18.  (recursive_read_and_assert_all_clauses)
  19.  (seen) /* close the file */
  20.  (see OldFile_we_were_reading) /* back to old state */
  21. )
  22.  
  23. ((recursive_read_and_assert_all_clauses)
  24.  (read Clause_body) /* fails on EOF */
  25.  (assertz Clause_body)
  26.  (recursive_read_and_assert_all_clauses)
  27. )
  28. (recursive_read_and_assert_all_clauses) /* come here on EOF */
  29.  
  30. /************** version 2 **************/
  31. /* a dirty prolog programming trick that does not overflow stack */
  32.  
  33. ((alternative_consult_2 Filename)
  34.  (seeing OldFile_we_were_reading) /* hang on to it ! */
  35.  (see Filename) /* read from this now */
  36.  (recursive_read_and_assert_all_clauses)
  37.  (seen) /* close the file */
  38.  (see OldFile_we_were_reading) /* back to old state */
  39. )
  40.  
  41. ((fail_driven_read_and_assert_all_clauses)
  42.  (eternal_backtrack_point)/* come back here because of failure */
  43.  (read_and_assert_clause_then_fail)
  44.  (cut) /* come here on EOF */
  45. )
  46. (fail_driven_read_and_assert_all_clauses)/* forces success at end */
  47.  
  48. ((read_and_assert_clause_then_fail)
  49.  (read Clause_body) /* this fails on EOF */
  50.  (assertz Clause_body)
  51.  (cut)
  52.  (fail)
  53. )
  54. (read_and_assert_clause_then_fail) /* come here on EOF */
  55.  
  56. /* this succeeds indefinitely  - sometimes called repeat */
  57. (eternal_backtrack_point)
  58. ((eternal_backtrack_point)
  59.  (eternal_backtrack_point)
  60. )
  61.